package com.team.RunsFast_Api.server;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;

/**
 * ━━━━━━神兽出没━━━━━━
 * 　　　┏┓　　　┏┓
 * 　　┏┛┻━━━┛┻┓
 * 　　┃　　　　　　 ┃
 * 　　┃　　　━　　　┃
 * 　　┃　┳┛　┗┳　  ┃
 * 　　┃　　　　　　 ┃
 * 　　┃　　　┻　　　┃
 * 　　┃　　　　　　　┃
 * 　　┗━┓　　　┏━┛Code is far away from bug with the animal protecting
 * 　　　　┃　　　┃    神兽保佑,代码无bug
 * 　　　　┃　　　┃
 * 　　　　┃　　　┗━━━┓
 * 　　　　┃　　　　　　　┣┓
 * 　　　　┃　　　　　　　┏┛
 * 　　　　┗┓┓┏━┳┓┏┛
 * 　　　　　┃┫┫　┃┫┫
 * 　　　　　┗┻┛　┗┻┛
 * ━━━━━━永无BUG!━━━━━━
 *
 * @Description:
 * @Author: 邢朋辉
 * @Date: 2022/9/26 11:48
 */
@Component //IOC创建对象
@Scope(scopeName = "prototype")//IOC创建对象的方式：单例和多例，必须多例
@ServerEndpoint("/ws/chat/{name}")//设置服务器的地址,和路径变量
public class ChatServer {
    //日志，slf4J
    private Logger logger= LoggerFactory.getLogger(ChatServer.class);
    //记录在线的用户 线程安全
    public static final ConcurrentHashMap<String,Session> users=new ConcurrentHashMap<>();

    private String name;//当前的用户名
    private Session session;//会话对象

    //打开连接 新用户连接
    @OnOpen
    public void open(@PathParam("name")String name,Session session) throws IOException {
        //1.验证用户昵称是否存在
        if(users.containsKey(name)){
            //2.发送消息-对方
            session.getBasicRemote().sendText("亲，昵称已存在！");
        }else {
            //3.昵称可用
            this.name=name;
            this.session=session;
            users.put(name,session);
            //4.发送消息-群发
            sendMoreMsg("系统消息：家人们，让我们用热烈的掌声，欢迎"+name+"加入我们！来，啤酒刷起来！");
        }
    }
    //接收消息
    @OnMessage
    public void message(String msg){
        logger.warn("接收消息："+msg);
        //转发消息-群发
        sendMoreMsg(name+"说："+msg);
    }
    //连接关闭
    @OnClose
    public void close(Session session){
        logger.warn(name+"退出了聊天室！");
        //移除
        users.remove(name);
        //群发消息
        sendMoreMsg("系统消息："+name+"离开了我们，我们伤心1毫秒！");
    }
    //通信错误，执行
    @OnError
    public void error(Throwable throwable){
        logger.error(throwable.getMessage());
    }
    //实现消息的群发
    public static void sendMoreMsg(String msg){
        //1.遍历在线的用户
        users.keySet().forEach(s->{
            try {
                //2.发送消息
                users.get(s).getBasicRemote().sendText(msg);
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
    }
}
